// 文件名：basic_string_config_render.cpp
// 目的：渲染简单的占位符模板，将文本中的 ${key} 替换为变量表中的 value。
// 实现要点：
//   - 遍历 vars（map 保证按键有序，但替换逻辑对顺序无依赖）；
//   - 为每个 key 构造占位符 "${key}"，使用 find + replace 循环替换所有出现位置；
//   - 每次替换后将游标前移 value.size()，避免在替换文本中再次匹配到同一位置（防死循环）。
// 复杂度：
//   - 对每个键执行 O(L) 的查找与替换（L 为 text 长度），总体近似 O(|vars| * L)，替换次数越多常数越大。
// 注意事项：
//   - 缺失变量：模板中存在但 vars 不包含的占位符会原样保留（不会报错/删除）；
//   - 覆盖/重叠：若存在 key="user" 与 key="username" 等，替换顺序可能影响结果（比如先替换 username 更稳妥）；
//   - 递归替换：若 value 自身包含形如 ${x} 的片段，当前实现不会继续展开（单次替换）；需要递归则应循环至稳定或控制深度；
//   - 安全性：用于配置文本一般安全；若渲染 HTML/SQL 等，则另行考虑转义与注入风险；
//   - 性能优化：可一次扫描构建输出（状态机/Trie），避免对每个键反复扫描；或使用正则批量匹配后回调替换。

#include <iostream>
#include <map>
#include <string>

std::string renderTemplate(std::string text,
                           const std::map<std::string, std::string>& vars) {
    for (const auto& [key, value] : vars) {
        const std::string placeholder = "${" + key + "}";
        std::size_t pos = 0;
        while ((pos = text.find(placeholder, pos)) != std::string::npos) {
            text.replace(pos, placeholder.size(), value);
            pos += value.size();
        }
    }
    return text;
}

int main() {
    std::string tpl =
        "db.url = jdbc://${host}:${port}/${database}\n"
        "db.user = ${user}\n"
        "db.pass = ${password}\n";

    std::map<std::string, std::string> vars = {
        {"host", "127.0.0.1"},
        {"port", "5432"},
        {"database", "analytics"},
        {"user", "etl"},
        {"password", "s3cr3t"}
    };

    std::string rendered = renderTemplate(tpl, vars);
    std::cout << rendered << '\n';
    return 0;
}